package com.gopay.common.util;

import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import org.apache.log4j.Logger;

/**
 * 常用正则表达式检查
 * 
 * @PatternCheck.java
 * @author GongZhong
 * @2013-1-9 下午07:30:10 www.gopay.com.cn Inc.All rights reserved.
 */
public abstract class PatternCheck {
    /** 配置log4j. */
    private static Logger logger = Logger.getLogger("PatternCheck");

    /** 构造. */
    private PatternCheck() {
    }

    /**
     * 日期检查. yyyy-mm-dd 年：1600－9999 会检查闰月.
     */
    public static final String IS_VALID_DATE = "^((1[6-9]|[2-9]\\d)\\d{2})-(((0[13578]|1[02])-31)|((0[1,3-9]|1[0-2])-(29|30)))$|"
            + "^(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|"
            + "((16|[2468][048]|[3579][26])00)))-(02-29)$|^((1[6-9]|[2-9]\\d)\\d{2})-((0[1-9])|(1[0-2]))-(0[1-9]|1\\d|2[0-8])$";

    /**
     * 日期检查. yyyymmdd 年：1600－9999 会检查闰月.
     */
    public static final String IS_VALID_DATE_ONLY_NUMBER = "^((1[6-9]|[2-9]\\d)?\\d{2})(((0[13578]|1[02])31)|((0[1,3-9]|1[0-2])(29|30)))$|"
            + "^(((1[6-9]|[2-9]\\d)?(0[48]|[2468][048]|[13579][26])|"
            + "((16|[2468][048]|[3579][26])00)))(0229)$|^((1[6-9]|[2-9]\\d)?\\d{2})((0[1-9])|(1[0-2]))(0[1-9]|1\\d|2[0-8])$";

    /**
     * 金额检查. x代表至少1位数字，y代表1位数字 x 或 x.y 或 x.yy 如：'100', '0.2', '12.34' 不接受 x. 或.
     * 0x 如：'1.' , '05'
     */
    public static final String IS_DECIMAL = "^(([1-9][0-9]*)|[0-9])((\\.(\\d{1,2}))|)$";

    /**
     * 密码检查. 长度6－20位 接受任何可见字符.
     */
    public static final String IS_PASSWORD = "^[\\p{Graph}]{6,20}$";

    /**
     * 代扣交易，动态密码检查. 长度1－20位 只接受数字，大小写字母.
     */
    public static final String DYNAMIC_PASSWORD = "^[0-9a-zA-Z]{1,20}$";

    /**
     * 数字检查. 长度大于1位 只接受数字.
     */
    public static final String IS_NUMBER = "^[0-9]+$";

    /**
     * 接受数字或字母 长度大于1位.
     */
    public static final String IS_NUM_OR_LETTER = "^[0-9a-zA-Z]+$";
    /**
     * 接受单词字符. 数字字母或下划线.
     */
    public static final String IS_WORD = "^[\\w]+$";
    /**
     * 接受任何可见字符. 长度大于1位.
     */
    public static final String IS_PGRAPH = "^[\\p{Graph}]+$";

    /**
     * Email检查. 具体格式未知.
     */
    public static final String IS_EMAIL = "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$";

    /**
     * 6位时间检查. 时：00－23 分：00－59 秒：00－59.
     */
    public static final String IS_TIME = "^(([0-1][0-9])|(2[0-3]))([0-5][0-9])([0-5][0-9])$";

    /**
     * 有效的URL.
     */
    public static final String IS_URL = "^(http|https)://.*$";

    /**
     * 有效日期最大长度,8位.
     */
    public static final int DATE_LEN = 8;
    
    /**
     * 有效的手机号码
     */
    //public static final String IS_MOBILE ="^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
    public static final String IS_MOBILE ="^1\\d{10}$";

    /**
     * 有效性检查.
     * 
     * @return ture or false
     * @param formValue
     *            字符串值
     * @param formatString
     *            字符串格式
     */
    public static boolean validateFormat(String formValue, String formatString) {
        boolean match = true;
        if (formatString == null || formatString.trim().length() == 0) {
            return match;
        }
        try {
            match = Pattern.matches(formatString, formValue);
        } catch (PatternSyntaxException e) {
            logger.error("PatternSyntaxException");
        }
        if (!match) {
            logger.error("!match");
        }

        // add check character '
        if ((formValue.indexOf("'")) >= 0) {
            match = false;
        }
        return match;
    }

    /**
     * 判断是否是数字(长度>=1).
     * 
     * @param value
     *            字符串值
     * @return ture or false
     */
    public static boolean isNumber(String value) {
        return validateFormat(value, IS_NUMBER);
    }

    /**
     * 判断是否是数字或字母(长度>=1).
     * 
     * @param value
     *            字符串值
     * @return ture or false
     */
    public static boolean isNumOrLett(String value) {
        return validateFormat(value, IS_NUM_OR_LETTER);
    }

    /**
     * 判断是否是单词字符. 数字字母或下划线
     * 
     * @param value
     *            字符串值
     * @return ture of false
     */
    public static boolean isWord(String value) {
        return validateFormat(value, IS_WORD);
    }

    /**
     * 判断是否是可见字符(长度>=1).
     * 
     * @param value
     *            字符串值
     * @return ture or false
     */
    public static boolean isPGraph(String value) {
        return validateFormat(value, IS_PGRAPH);
    }

    /**
     * 判断是否是有效金额X.YY.
     * 
     * @param value
     *            字符串值
     * @return ture or false
     */
    public static boolean isAmt(String value) {
        return validateFormat(value, IS_DECIMAL);
    }

    /**
     * 判断是否是有效日期YYYYMMDDhhmmss.
     * 
     * @param value
     *            字符串值
     * @return true or false
     */
    public static boolean isValidDateTime(String value) {
        return validateFormat(value.substring(0, DATE_LEN), IS_VALID_DATE_ONLY_NUMBER)
                && validateFormat(value.substring(DATE_LEN), IS_TIME);
    }

    /**
     * 判断是否是有效的URL地址.
     * 
     * @param value
     *            字符串值
     * @return true or false
     */
    public static boolean isURL(String value) {
        value = value.toLowerCase();
        return validateFormat(value, IS_URL);
    }

    /**
     * 判断是否是有效的Email.
     * 
     * @param value
     *            字符串值
     * @return true or false
     */
    public static boolean isEmail(String value) {
        return validateFormat(value, IS_EMAIL);
    }

    /**
     * 判断是否是有效的手机号码.
     * 
     * @param value
     *            字符串值
     * @return true or false
     */
    public static boolean isMobile(String value){
        return validateFormat(value, IS_MOBILE);
    }
}
